/*
    封装实现一个SqliteHelper类，提供简单的sqlite数据库操作，完成对库，数据的增删查改
     1. 创建/打开数据库文件
     2. 针对打开的数据库执行的操作
         .表的操作
         .数据的操作
     3. 关闭数据库
*/
#include <iostream>
#include <string>
#include <vector>
#include <sqlite3.h>

class SqliteHelper
{
public:
    typedef int (*SqliteCallback)(void *, int, char **, char **);

    SqliteHelper(const std::string &dbfile) : _dbfile(dbfile) ,_handler(nullptr) {}
    bool open(int safe_level = SQLITE_OPEN_FULLMUTEX)
    {
        int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler,
                                  SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_level, nullptr);
        if (ret != SQLITE_OK)
        {
            std::cout << "打开/创建sqlite数据库失败" << std::endl;
            return false;
        }
        return true;
    }
    bool exec(const std::string &sql, SqliteCallback cb, void *arg)
    {
        int ret = sqlite3_exec(_handler, sql.c_str(), cb, arg, nullptr); //sqlite3_exec内部将arg当作cb的第一个参数传递
        if (ret != SQLITE_OK)
        {
            std::cout << sql << " 执行语句失败" << std::endl;
            return false;
        }
        return true;
    }
    void close()
    {
        if(_handler)
            sqlite3_close_v2(_handler);
    }

private:
    std::string _dbfile;
    sqlite3 *_handler;
};